package com.example.controller;


import com.example.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @author fyxw
 */
@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * <b>测试字段验证</b>
     * <p>注意：若只有User形参，(public String addUser(@Valid User user))
     * 验证无法通过后会直接抛出异常，若与以下方法签名一致
     * （public String addUser(@Valid User user, BindingResult result)）
     * ，则验证无法通过，不会抛异常，需要自己手动处理(result.hasErrors())</p>
     * <p>根据运行结果推测，无论是否验证通过，都会自动封装User，故运行机制应是
     * <i>先封装前端数据，再根据对象字段注解验证数据，并且在封装前端数据中，出现错误
     * 会同样将错误保存到result中</i></p>
     * @param user 前端返回数据封装对象
     * @param result 验证后的结果对象，储存着验证后的错误信息
     * @return 返回最后的结果，如果验证通过则为user的信息，否则为错误信息
     */
    @RequestMapping(value = "/addUser",produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String addUser(@Valid User user, BindingResult result) {
        System.out.println(user);
        if (result.hasErrors()) {
            List<FieldError> fieldErrors = result.getFieldErrors();
            StringBuilder strBuilder= new StringBuilder();
            for (FieldError error : fieldErrors) {
                strBuilder.append(error.getField()).append(":").append(error.getDefaultMessage()).append("\n");
            }
            return strBuilder.toString();
        }
        return user.toString();
    }
}
